/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;

import Abastecimiento.GestionarProveedorAbastecimiento;
import Movilizacion.GestionarBarrios;
import Movilizacion.GestionarConstrucciones;
import Movilizacion.GestionarProveedorMovilizacion;
import Movilizacion.GestionarPuntosEmergencia;
import commonsbeans.SessionBean;
import java.io.IOException;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.map.MarkerDragEvent;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.event.map.StateChangeEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

/**
 *
 * @author Felipe Duarte
 */
@ManagedBean
@ViewScoped
public class GMapBean {

    @ManagedProperty(value = "#{sessionBean}")
    private SessionBean sessionBean;
    @ManagedProperty(value = "#{gestionarBarrios}")
    private GestionarBarrios gestionarBarrios;
    @ManagedProperty(value = "#{gestionarProveedorMovilizacion}")
    private GestionarProveedorMovilizacion gestionarProveedorMovilizacion;
    @ManagedProperty(value = "#{gestionarProveedorAbastecimiento}")
    private GestionarProveedorAbastecimiento gestionarProveedorAbastecimiento;
    @ManagedProperty(value = "#{gestionarConstrucciones}")
    private GestionarConstrucciones gestionarConstrucciones;
    @ManagedProperty(value="#{gestionarPuntosEmergencia}")
    private GestionarPuntosEmergencia gestionarPuntosEmergencia;
    private MapModel model;
    private double centerLat, centerLong;
    private int zoomLevel;
    private boolean puntoSeleccionado;

    /**
     * Creates a new instance of GMapTestBean
     */
    public GMapBean() {
    }

    //Constructor
    @PostConstruct
    public void init() {
        if (sessionBean.getUsuarioActual() != null) {
            centerLat = sessionBean.getUsuarioActual().getCiudadIdCiudad().getLatitudCiudad();
            centerLong = sessionBean.getUsuarioActual().getCiudadIdCiudad().getLongitudCiudad();
            zoomLevel = 14;
            puntoSeleccionado = false;
        } else {
            try {
                FacesContext.getCurrentInstance().getExternalContext().redirect("faces/Error.xhtml");
            } catch (IOException ex) {
            }
        }
    }

    //<editor-fold defaultstate="collapsed" desc="Funcionalidades">
    /**
     * Metodo para arrastrar el marcador en el mapa de barrios
     *
     */
    public void markerDragListenerBarrio(MarkerDragEvent ev) {
        Marker marker = ev.getMarker();
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarBarrios.getBarrio().setLongitudBarrio(longitud);
        gestionarBarrios.getBarrio().setLatitudBarrio(latitud);
        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador Movido", "Latitud:"
                + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));

    }

    /**
     * Metodo para poner el marcador en el mapa de barrios
     *
     */
    public void pointSelectListenerBarrio(PointSelectEvent ev) {
        model = new DefaultMapModel();
        Marker marker = new Marker(ev.getLatLng());
        marker.setDraggable(true);
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarBarrios.getBarrio().setLongitudBarrio(longitud);
        gestionarBarrios.getBarrio().setLatitudBarrio(latitud);
        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador agregado",
                "Latitud:" + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));
        model.addOverlay(marker);
    }

    /**
     * Metodo para poner el marcador en el mapa de Registro de Construcciones
     *
     */
    public void pointSelectListenerConstruccion(PointSelectEvent ev) {
        model = new DefaultMapModel();
        Marker marker = new Marker(ev.getLatLng());
        marker.setDraggable(true);
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarConstrucciones.getConstruccion().setLongitudConstruccion(longitud);
        gestionarConstrucciones.getConstruccion().setLatitudConstruccion(latitud);
        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador agregado",
                "Latitud:" + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));
        model.addOverlay(marker);
    }

    /**
     * Metodo para arrastrar el marcador en el mapa de registro de
     * Construcciones
     *
     */
    public void markerDragListenerConstruccion(MarkerDragEvent ev) {
        Marker marker = ev.getMarker();
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarConstrucciones.getConstruccion().setLongitudConstruccion(longitud);
        gestionarConstrucciones.getConstruccion().setLatitudConstruccion(latitud);
        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador Movido", "Latitud:"
                + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));

    }

    /**
     * Metodo para seleccionar el marcador en el mapa de proveedores de
     * movilizacion
     *
     */
    public void pointSelectListenerProveedorMovilizacion(PointSelectEvent ev) {
        model = new DefaultMapModel();
        Marker marker = new Marker(ev.getLatLng());
        marker.setDraggable(true);
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarProveedorMovilizacion.getProveedor().setLongitudProveedor(longitud);
        gestionarProveedorMovilizacion.getProveedor().setLatitudProveedor(latitud);

        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador agregado",
                "Latitud:" + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));
        model.addOverlay(marker);
    }

        /**
     * Metodo para arrastrar el marcador en el mapa puntos de emergencia
     *
     */
    public void markerDragListenerPuntoEmergencia(MarkerDragEvent ev) {
        Marker marker = ev.getMarker();
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarPuntosEmergencia.getPuntoEmergencia().setLatitudPuntoEmergencia(latitud);
        gestionarPuntosEmergencia.getPuntoEmergencia().setLongitudPuntoEmergencia(longitud);
        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador Movido", "Latitud:"
                + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));

    }
    
    
    
    /**
     * Metodo para arrastrar el marcador en el mapa de proveedor de movilizacion
     *
     */
    public void markerDragListenerProveedorMovilizacion(MarkerDragEvent ev) {
        Marker marker = ev.getMarker();
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarProveedorMovilizacion.getProveedor().setLongitudProveedor(longitud);
        gestionarProveedorMovilizacion.getProveedor().setLatitudProveedor(latitud);
        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador Movido", "Latitud:"
                + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));

    }
    
    
    /**
     * Metodo para seleccionar el marcador en el mapa de puntos de emergencia
     *
     */
    public void pointSelectListenerPuntoEmergencia(PointSelectEvent ev) {
        model = new DefaultMapModel();
        Marker marker = new Marker(ev.getLatLng());
        marker.setDraggable(true);
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarPuntosEmergencia.getPuntoEmergencia().setLongitudPuntoEmergencia(longitud);
        gestionarPuntosEmergencia.getPuntoEmergencia().setLatitudPuntoEmergencia(latitud);
        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador agregado",
                "Latitud:" + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));
        model.addOverlay(marker);
    }
    

    /**
     * Metodo para seleccionar el marcador en el mapa de proveedor de
     * abastecimiento
     *
     */
    public void pointSelectListenerProveedorAbastecimiento(PointSelectEvent ev) {
        model = new DefaultMapModel();
        Marker marker = new Marker(ev.getLatLng());
        marker.setDraggable(true);
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarProveedorAbastecimiento.getProveedor().setLongitudProveedor(longitud);
        gestionarProveedorAbastecimiento.getProveedor().setLatitudProveedor(latitud);
        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador agregado",
                "Latitud:" + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));
        model.addOverlay(marker);
    }

    /**
     * Metodo para arrastrar el marcador en el mapa de proveedor de
     * abastecimiento
     *
     */
    public void markerDragListenerProveedorAbastecimiento(MarkerDragEvent ev) {
        Marker marker = ev.getMarker();
        Float longitud = 0.F;
        Float latitud = 0.F;
        longitud = Double.valueOf(marker.getLatlng().getLng()).floatValue();
        latitud = Double.valueOf(marker.getLatlng().getLat()).floatValue();
        gestionarProveedorAbastecimiento.getProveedor().setLongitudProveedor(longitud);
        gestionarProveedorAbastecimiento.getProveedor().setLatitudProveedor(latitud);
        centerLat = marker.getLatlng().getLat();
        centerLong = marker.getLatlng().getLng();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marcador Movido", "Latitud:"
                + marker.getLatlng().getLat() + ", Longitud:" + marker.getLatlng().getLng()));

    }

    private void addMessage(FacesMessage message) {
        FacesContext.getCurrentInstance().addMessage(null, message);
    }
//</editor-fold>

    //<editor-fold defaultstate="collapsed" desc="Getter's and Setter's">
    public MapModel getModel() {
        return model;
    }

    public void setModel(MapModel model) {
        this.model = model;
    }

    public GestionarPuntosEmergencia getGestionarPuntosEmergencia() {
        return gestionarPuntosEmergencia;
    }

    public void setGestionarPuntosEmergencia(GestionarPuntosEmergencia gestionarPuntosEmergencia) {
        this.gestionarPuntosEmergencia = gestionarPuntosEmergencia;
    }
    

    public boolean isPuntoSeleccionado() {
        return puntoSeleccionado;
    }

    public void setPuntoSeleccionado(boolean puntoSeleccionado) {
        this.puntoSeleccionado = puntoSeleccionado;
    }

    public int getZoomLevel() {
        return zoomLevel;
    }

    public void setZoomLevel(int zoomLevel) {
        this.zoomLevel = zoomLevel;
    }

    public double getCenterLat() {
        return centerLat;
    }

    public void setCenterLat(double centerLat) {
        this.centerLat = centerLat;
    }

    public double getCenterLong() {
        return centerLong;
    }

    public void setCenterLong(double centerLong) {
        this.centerLong = centerLong;
    }

    public SessionBean getSessionBean() {
        return sessionBean;
    }

    public void setSessionBean(SessionBean sessionBean) {
        this.sessionBean = sessionBean;
    }

    public void stateChangeListener(StateChangeEvent ev) {
        zoomLevel = ev.getZoomLevel();
    }

    public GestionarBarrios getGestionarBarrios() {
        return gestionarBarrios;
    }

    public void setGestionarBarrios(GestionarBarrios gestionarBarrios) {
        this.gestionarBarrios = gestionarBarrios;
    }

    public GestionarConstrucciones getGestionarConstrucciones() {
        return gestionarConstrucciones;
    }

    public void setGestionarConstrucciones(GestionarConstrucciones gestionarConstrucciones) {
        this.gestionarConstrucciones = gestionarConstrucciones;
    }

    public GestionarProveedorMovilizacion getGestionarProveedorMovilizacion() {
        return gestionarProveedorMovilizacion;
    }

    public void setGestionarProveedorMovilizacion(GestionarProveedorMovilizacion gestionarProveedorMovilizacion) {
        this.gestionarProveedorMovilizacion = gestionarProveedorMovilizacion;
    }

    public GestionarProveedorAbastecimiento getGestionarProveedorAbastecimiento() {
        return gestionarProveedorAbastecimiento;
    }

    public void setGestionarProveedorAbastecimiento(GestionarProveedorAbastecimiento gestionarProveedorAbastecimiento) {
        this.gestionarProveedorAbastecimiento = gestionarProveedorAbastecimiento;
    }
    //</editor-fold>
}
